perm filename TRYNXT.LSP[C,JRA]1 blob
sn#012874 filedate 1972-11-15 generic text, type T, neo UTF8
00200
00300 (GLOBAL
00400 (FUNCTIONS TRY-NEXT NOTE ADIEU AU-REVOIR INSTANCE GET-POSSIBILITIES
00500 SET-POSSIBILITIES GENERATE)
00600 (RESERVED *IGNORE *ITEM *NOTE *METHOD *GENERATOR *AU-REVOIR *BLOCK *POSSIBILITI!
00700 ES))
00800
00900 (DECLARE (SYMBOLS T) (GENPREFIX \T) (GENSYM 'T)
01000 (SPECIAL TEM TEM1 TEM2 ALINK BVARS EXP CLINK FRAME* VAL)
01100 (*FEXPR CERR INSTANCE PROPOSE /,)
01200 (*LEXPR CSET VFRAME ACCESS CONTROL))
01300
01400 (DEFUN ALINK MACRO (L) (LIST 'CDADR (CADR L)))
01500
01600 (DEFUN CLINK MACRO (L) (LIST 'CDDDR (CADR L)))
01700
01800 (CDEFUN TRY-NEXT (POSSIBILITIES "OPTIONAL" (NOMORE NIL) (MESSAGE NIL))
01900 "AUX" (POS)
02000 (/: TRY-NEXT) (GO (NEXT))
02100 (/: EXIT) (RETURN (CEVAL NOMORE (ACCESS)))
02200 (/: RETURN) (RETURN POS)
02300 (/: *METHOD) (METGO)
02400 (/: *GENERATOR) (GENGO)
02500 (/: *AU-REVOIR) (REGO)
02600 (/: *BLOCK) (TBLOCK))
02700
02800 (DEFUN NEXT FEXPR (L)
02900 (SETQ L (/, POSSIBILITIES))
03000 (COND ((OR (ATOM L) (NOT (EQ (CAAR L) '*POSSIBILITIES)))
03100 (CERR BAD POSSIBILITIES LIST)))
03200 (PROG (P)
03300 (COND ((NULL (CDR L)) (RETURN 'EXIT)))
03400 (UNBLOCK (CDR L))
03500 TN (RPLACD L (CDDR L))
03600 (COND ((NULL (CDR L)) (RETURN 'EXIT))
03700 ((EQ (SETQ P (CADR L)) '*IGNORE) (GO TN))
03800 ((ATOM P) (CSET 'POS P) (RETURN 'RETURN))
03900 ((EQ (CAR P) '*ITEM)
04000 (SETUP (CADDR P))
04100 (CSET 'POS (CADR P))
04200 (RETURN 'RETURN))
04300 ((EQ (CAR P) '*NOTE)
04400 (SETUP (CADR P))
04500 (CSET 'POS P)
04600 (RETURN 'RETURN))
04700 ((MEMQ (CAR P) '(*METHOD *GENERATOR *AU-REVOIR *BLOCK))
04800 (RETURN (CAR P)))
04900 (T (CSET 'POS P) (RETURN 'RETURN)))))
05000
05100 (DEFUN SETUP (ALIST)
05200 (SETQ TEM (ACCESS))
05300 (MAPC '(LAMBDA (PAIR) (CSET (CAR PAIR) (CADR PAIR) TEM)) ALIST))
05400
05500 (DEFUN GENGO ()
05600 (SETQ TEM (CDR (IVAL 'POSSIBILITIES ALINK))
05700 BVARS (LIST (LIST 'NEXT TEM))
05800 CLINK (FR (TAG 'TRY-NEXT))
05900 ALINK (ALINK CLINK)
06000 TEM1 (CADAR TEM)
06100 FRAME* NIL)
06200 (RPLACA TEM (LIST '*BLOCK))
06300 (DISPATCH TEM1 'POPJ () '*TOP))
06400 (DEFPROP GENGO GENGO CINT)
06500
06600 (DEFUN METGO ()
06700 (SETQ TEM (CDR (IVAL 'POSSIBILITIES ALINK))
06800 TEM1 (CADAR TEM)
06900 BVARS (NCONC (LIST (LIST 'NEXT TEM)
07000 (LIST '*BODY (TEXT TEM1))
07100 (LIST '*CALLPAT (CADDDR (CDAR TEM)))
07200 (LIST '*METHPAT (PATTERN TEM1))
07300 (LIST '*CALLALIST (CADDDR (CAR TEM)))
07400 (LIST '*METHALIST (CADDAR TEM)))
07500 (CADDAR TEM))
07600 EXP (LIST TEM1 (CADDDR (CDAR TEM)))
07700 FRAME* NIL
07800 CLINK (FR (TAG 'TRY-NEXT))
07900 ALINK (ALINK CLINK))
08000 (CLOSE)
08100 (RPLACA TEM (LIST '*BLOCK))
08200 'AUXB)
08300 (DEFPROP METGO METGO CINT)
08400
08500 (DEFUN REGO ()
08600 (SETQ TEM (CDR (IVAL 'POSSIBILITIES ALINK))
08700 VAL (IVAL 'MESSAGE ALINK)
08800 FRAME* (CADAR TEM))
08900 (SETCONTROL (VFRAME 'NEXT (CAR TEM)) (TAG 'TRY-NEXT))
09000 (CSET 'NEXT TEM (CAR TEM))
09100 (RPLACA TEM (LIST '*BLOCK))
09200 (RESTORE))
09300 (DEFPROP REGO REGO CINT)
09400
09500 (CDEFUN TBLOCK ()
09600 (NCONC (CADR POSSIBILITIES) (TAG 'TRY-NEXT))
09700 (ALLOW NIL)
09800 (COND ((/@ . READY) (CONTINUE (/@ PROG2 (ALLOW T) (CAR READY) (SETQ READY (CDR !
09900 READY))))))
10000 (ALLOW T)
10100 (LISTEN 'ALL-BLOCKED-UP))
10200
10300 (DEFUN UNBLOCK (L)
10400 (COND ((EQ (CAAR L) '*BLOCK)
10500 (NCONC (GET 'READY 'VALUE) (CDAR L))
10600 (RPLACA L '*IGNORE))))
10700
10800 (DEFUN NOTE N
10900 (COND ((= N 0)
11000 ((LAMBDA (P) (COND (P (ENTER P))))
11100 (INSTANCE))
11200 0)
11300 (T (PROG (NEXT M)
11400 (SETQ M 0 NEXT (CDR (VLOC 'NEXT)))
11500 LP (COND ((> (SETQ M (ADD1 M)) N) (RETURN N)))
11600 (RPLACD (CAR NEXT) (CONS (ARG M)(CDAR NEXT)))
11700 (RPLACA NEXT (CDAR NEXT))
11800 (GO LP)))))
11900
12000 (CDEFUN ADIEU ("REST" L) (PROPOSE) (DISMISS (VFRAME 'NEXT)))
12100
12200 (CDEFUN AU-REVOIR ("REST" L) (PROPOSE)
12300 (ENTER (CONS '*AU-REVOIR (CDR (CONTROL))))
12400 (DISMISS (VFRAME 'NEXT)))
12500
12600 (DEFUN ENTER (X)
12700 (SETQ TEM (CDR (VLOC 'NEXT)))
12800 (RPLACD (CAR TEM) (CONS X (CDAR TEM)))
12900 (RPLACA TEM (CDAR TEM)))
13000
13100 (DEFUN PROPOSE FEXPR (L)
13200 (SETQ L (CDR (VLOC 'NEXT)))
13300 (MAPC '(LAMBDA (X)
13400 (RPLACD (CAR L) (CONS X (CDAR L)))
13500 (RPLACA L (CDAR L)))
13600 (/, L)))
13700
13800 (DEFUN INSTANCE FEXPR (L)
13900 (PROG (NEXTF CALLA)
14000 (SETQ NEXTF (FR (VFRAME 'NEXT))
14100 CALLA (IVAL '*CALLALIST NEXTF)
14200 L (MATCH (IVAL '*CALLPAT NEXTF)
14300 (IVAL '*METHPAT NEXTF)
14400 CALLA
14500 (IVAL '*METHALIST NEXTF)))
14600 (COND (L (RETURN (LIST '*NOTE (CPY (CAR L))))))))
14700
14800 (DEFUN CPY (L) (MAPCAR '(LAMBDA (X) (LIST (CAR X)(CADR X))) L))
14900
15000 (DEFUN GET-POSSIBILITIES FEXPR () (IVAL 'POSSIBILITIES (CLINK (FR (VFRAME 'NEXT))!
15100 )))
15200
15300 (DEFUN SET-POSSIBILITIES (LIST) (CSET 'POSSIBILITIES LIST (CONTROL (VFRAME 'NEXT)!
15400 )))
15500
15600 (CDEFUN GENERATE ('FORM) "AUX" ((POSSIBILITIES
15700 (LIST (LIST '*POSSIBILITIES FORM)
15800 (LIST '*GENERATOR FORM))))
15900 (GENGO)
16000 (/: TRY-NEXT)
16100 POSSIBILITIES)
16200